/**
 * Copyright: Copyright (c) 2012
 * Company:深圳市海乐淘电子商务有限公司
 * @author lifuyu
 * @date 2012-4-25 上午9:54:21
 * @version V1.0
 *
 * @Description: 这个是系统通用工具类，定义一些通用的方法
 */
package com.ml.framework.tools;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import sun.misc.BASE64Encoder;

public class CUtils
{
	private static final String FMT = "yyyy-MM-dd HH:mm:ss";
	// 数字正则
	private static final Pattern re_Number = Pattern.compile("[0-9]+");

	/**
	 * 是否整数
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isInteger(String s)
	{
		if (s == null)
			return false;
		return s.matches("(0|-?[1-9]{1}[0-9]*)");
	}

	/**
	 * 是否小数
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isDecimal(String s)
	{
		if (s == null)
			return false;
		return s.matches("(0|-?[1-9]{1}[0-9]*)(.[0-9]+)?");
	}

	/**
	 * 是否价格形式的数字，包括2小数点
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isPriceDecimal(String s)
	{
		if (s == null)
			return false;
		return s.matches("(0|-?[1-9]{1}[0-9]*)(.[0-9]{1,8})?");
	}

	/**
	 * 转换字符串
	 * 
	 * 
	 * @param obj
	 * @return
	 */
	public static String toStr(Object obj)
	{
		return toStr(obj, false);
	}

	/**
	 * 转换字符串
	 * 
	 * 
	 * @param obj
	 * @return
	 */
	public static String toStr(Object obj, boolean toNull)
	{
		if (obj == null)
			return toNull ? null : "";
		if (obj instanceof String)
			return (String) obj;
		if (obj instanceof Date)
			return new SimpleDateFormat(FMT).format((Date) obj);
		return obj.toString();
	}

	/**
	 * 清除字符串两端空白字符，此方法只针对字符串，否则返回null
	 * 
	 * 
	 * @param obj
	 * @param toNull
	 *        如果是空字符串的情况是否返回null
	 * @return
	 */
	public static String trim(Object obj, boolean toNull)
	{
		if (obj == null)
			return toNull ? null : "";
		if (obj instanceof String)
		{
			if (toNull)
				return StringUtils.trimToNull((String) obj);
			else
				return StringUtils.trimToEmpty((String) obj);
		}
		else
		{
			String _v = String.valueOf(obj);
			return "null".equals(_v) ? toNull ? null : "" : _v;
		}
	}

	/**
	 * 清除字符串两端空白字符，此方法只针对字符串，否则返回null
	 * 
	 * 
	 * @param obj
	 * @return
	 */
	public static String trim(Object obj)
	{
		return trim(obj, false);
	}

	/**
	 * 判断对象是否为空
	 * 
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj)
	{
		if (obj == null)
			return true;
		if (obj instanceof String)
			return StringUtils.isBlank((String) obj);
		if (obj instanceof Map)
			return ((Map<?, ?>) obj).isEmpty();
		if (obj instanceof Collection)
			return ((Collection<?>) obj).isEmpty();
		if (obj instanceof Set)
			return ((Set<?>) obj).isEmpty();
		if (obj instanceof Object[])
			return ((Object[]) obj).length == 0;
		return false;
	}

	public static boolean isNotEmpty(Object obj)
	{
		return !isEmpty(obj);
	}

	/**
	 * 截断字符串
	 * 
	 * 
	 * @param s
	 * @param n
	 * @return
	 */
	public static String substr(String s, int n)
	{
		if (s == null)
			return s;
		int l = s.length();
		if (l >= n)
			return s.substring(0, n);
		else
			return s;
	}

	/**
	 * 判断是否是数字
	 * 
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNumber(String s)
	{
		if (s == null)
			return false;
		Matcher isNum = re_Number.matcher(s);
		return isNum.matches();
	}

	/**
	 * 校验提交过来的数据是否完整
	 * 
	 * 
	 * @param o
	 * @return
	 */
	public static boolean validateBeanValue(Object bean, String[] fields)
	{
		if (bean == null || fields == null || fields.length == 0)
			return false;
		for (String field : fields)
		{
			if (isEmpty(field))
				continue;
			Object val = null;
			try
			{
				val = BeanUtils.getAnyProp(bean, field);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			if (isEmpty(val))
				return false;
		}
		return true;
	}

	/**
	 * 从列表里获取匹配的对象
	 * 
	 * 
	 * @param list
	 * @param prop
	 * @param value
	 * @return
	 */
	public static <E> E getMatchFromList(List<E> list, String prop, Object value)
	{
		if (isEmpty(list) || value == null)
			return null;

		for (E obj : list)
		{
			String propVal = null;
			try
			{
				propVal = BeanUtils.getAnyProp(obj, prop);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			if (String.valueOf(value).equals(propVal))
				return obj;
		}
		return null;
	}

	/**
	 * 从列表里获取匹配的对象的子列表
	 * 
	 * 
	 * @param list
	 * @param prop
	 * @param value
	 * @return
	 */
	public static <E> List<E> getMatchSubFromList(List<E> list, String prop, Object value)
	{
		if (isEmpty(list) || value == null)
			return null;

		List<E> objList = new ArrayList<E>();
		for (E obj : list)
		{
			String propVal = null;
			try
			{
				propVal = BeanUtils.getAnyProp(obj, prop);
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
			if (String.valueOf(value).equals(propVal))
				objList.add(obj);
		}
		return objList;
	}

	/**
	 * 对象是否在数组中存在
	 * 
	 * 
	 * @param list
	 * @param prop
	 * @param value
	 * @return
	 */
	public static boolean isInArray(Object[] array, String prop, Object value)
	{
		if (isEmpty(array) || value == null)
			return false;

		for (Object obj : array)
		{
			String propVal = null;
			if (prop == null)
			{
				propVal = String.valueOf(obj);
			}
			else
			{
				try
				{
					propVal = BeanUtils.getAnyProp(obj, prop);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
			if (String.valueOf(value).equals(propVal))
				return true;
		}
		return false;
	}

	/**
	 * 对象是否在集合中存在
	 * 
	 * 
	 * @param list
	 * @param prop
	 * @param value
	 * @return
	 */
	public static boolean isInList(List<?> list, String prop, Object value)
	{
		if (isEmpty(list) || value == null)
			return false;

		for (Object obj : list)
		{
			String propVal = null;
			if (prop == null)
			{
				propVal = String.valueOf(obj);
			}
			else
			{
				try
				{
					propVal = BeanUtils.getAnyProp(obj, prop);
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
			if (String.valueOf(value).equals(propVal))
				return true;
		}
		return false;
	}

	/**
	 * 例如fine_name格式化成fineName
	 * 
	 * @param fieldName
	 * @return
	 */
	public static String fmtFiledName(String fieldName)
	{
		if (fieldName == null)
			return null;
		Pattern p = Pattern.compile("(_.{1})");
		// 用 Pattern 类的 matcher() 方法生成一个 Matcher 对象
		Matcher m = p.matcher(fieldName);
		StringBuffer sb = new StringBuffer();
		// 使用 find() 方法查找第一个匹配的对象
		boolean result = m.find();
		// 使用循环将句子里所有的 kelvin 找出并替换再将内容加到 sb 里
		while (result)
		{
			m.appendReplacement(sb, m.group().substring(1).toUpperCase());
			// 继续查找下一个匹配对象
			result = m.find();
		}
		// 最后调用 appendTail() 方法将最后一次匹配后的剩余字符串加到 sb 里；
		m.appendTail(sb);

		return sb.toString();
	}

	/**
	 * 从URL中获得参数
	 * 
	
	 * @param url
	 * @param name
	 * @return
	 */
	public static String getParamFromUrl(String url, String name)
	{
		if (url == null || name == null)
			return null;
		int p1 = url.indexOf((new StringBuilder("?")).append(name).append("=").toString());
		if (p1 == -1)
			p1 = url.indexOf((new StringBuilder("&")).append(name).append("=").toString());
		if (p1 == -1)
		{
			p1 = url.indexOf(name + "=");
			if (p1 == -1)
				return null;
		}
		else
			p1++;
		int p2 = url.indexOf("&", p1);
		if (p2 == -1)
			p2 = url.indexOf("#", p1);
		if (p2 == -1)
			p2 = url.length();
		return url.substring(p1 + name.length() + 1, p2);
	}

	/**
	 * 设置URL中的参数值
	 * 
	
	 * @param url
	 * @param name
	 * @param value
	 * @return
	 */
	public static String setParamToUrl(String url, String name, String value)
	{
		if (url.endsWith("#") || url.endsWith("?"))
			url = url.substring(0, url.length() - 1);
		int p1 = url.indexOf((new StringBuilder("?")).append(name).append("=").toString());
		if (p1 == -1)
			p1 = url.indexOf((new StringBuilder("&")).append(name).append("=").toString());
		if (p1 == -1)
		{
			p1 = url.indexOf(name + "=");
			if (p1 == -1)
				return url;
		}
		else
			p1++;

		int p2 = url.indexOf("&", p1);
		if (p2 != -1)
			url = (new StringBuilder(String.valueOf(url.substring(0, p1 + name.length() + 1)))).append(value).append(url.substring(p2)).toString();
		else
			url = (new StringBuilder(String.valueOf(url.substring(0, p1 + name.length() + 1)))).append(value).toString();

		return url;
	}

	/**
	 * 过滤html标签
	 * 
	
	 * @param str
	 * @return
	 */
	public static String filterHtml(String str)
	{
		Pattern pattern = Pattern.compile("<([^>]*)>");
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer();
		for (boolean result1 = matcher.find(); result1; result1 = matcher.find())
			matcher.appendReplacement(sb, "");

		matcher.appendTail(sb);
		return sb.toString();
	}

	/**
	 * 使用正则表达式获取匹配串
	 * 
	
	 * @param str
	 * @param reg
	 * @return
	 */
	public static String[] getMatcherSubString(String str, String reg)
	{
		List<String> ret = new ArrayList<String>();
		Pattern pattern = Pattern.compile(reg);
		Matcher matcher = pattern.matcher(str);
		for (boolean result1 = matcher.find(); result1; result1 = matcher.find())
		{
			String s = matcher.group();
			ret.add(s);
		}

		return (String[]) ret.toArray(new String[ret.size()]);
	}

	/**
	 * sql 值过滤，建议对查询的值进行过滤
	 * 
	
	 * @param s
	 * @return
	 */
	public static String svf(String s)
	{
		s = Pattern.compile("(\\'|\\s+(and|or)\\s+)", Pattern.CASE_INSENSITIVE).matcher(s).replaceAll("");
		return s;
	}

	/**
	 * 进行两次encode，为的是request能正确decode
	 * 
	 * @author kansum
	 */
	public static String urlDblEncode(String word) throws UnsupportedEncodingException
	{
		String _k = URLEncoder.encode(word, "UTF-8");
		return URLEncoder.encode(_k, "UTF-8");
	}

	/**
	 * 进行encode
	 * 
	 * @author kansum
	 */
	public static String urlEncode(String word) throws UnsupportedEncodingException
	{
		return URLEncoder.encode(word, "UTF-8");
	}

	/**
	 * 将request接收到的值进行正确decode
	 * 
	 * @author kansum
	 */
	public static String urlDecode(String word) throws UnsupportedEncodingException
	{
		return URLDecoder.decode(word, "UTF-8");
	}

	/**
	 * MD5加密后再base64编码
	 * 
	 * @param str
	 * @return
	 */
	public static String encode(String str)
	{
		try
		{
			byte[] bytes = str.getBytes();
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			byte[] d = md5.digest(bytes);
			BASE64Encoder base64en = new BASE64Encoder();
			String result = base64en.encode(d);
			return result;
		}
		catch (NoSuchAlgorithmException e)
		{// 此异常通常不会抛出
			throw new java.lang.RuntimeException(e);
		}
	}

	/**
	 * 转换由 ${z} 格式的模板
	 * 
	
	 * @param template
	 * @param map
	 * @return
	 */
	public static String fmtTemplate(String template, Map<String, Object> map)
	{
		if (map == null || map.isEmpty())
			return template;
		if (template == null)
			return null;

		Pattern p = Pattern.compile("(\\$\\{.+?\\})");
		// 用 Pattern 类的 matcher() 方法生成一个 Matcher 对象
		Matcher m = p.matcher(template);
		StringBuffer sb = new StringBuffer();
		// 使用 find() 方法查找第一个匹配的对象
		boolean result = m.find();
		// 使用循环将句子里所有的 kelvin 找出并替换再将内容加到 sb 里
		while (result)
		{
			String key = m.group();
			key = key.substring(2, key.length() - 1);
			if (map.containsKey(key))
			{
				m.appendReplacement(sb, String.valueOf(map.get(key)));
			}
			// 继续查找下一个匹配对象
			result = m.find();
		}
		// 最后调用 appendTail() 方法将最后一次匹配后的剩余字符串加到 sb 里；
		m.appendTail(sb);

		return sb.toString();
	}

}
